package cn.com.jonpad.demo04_mybatis.plugin;

import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;

import java.sql.Statement;
import java.util.Properties;

/**
 *  1）、编写插件实现Interceptor接口，并使用 @Intercepts注解完成插件签名
 * org.apache.ibatis.plugin.Signature
 * 		Class<?> type();
 * 		String method();
 * 		Class<?>[] args();
 * 	 2）、在全局配置文件中注册插件
 * 	 	spring boot 使用@Bean注入自定义的Plugin
 */
@Intercepts({
		@Signature(
				type = StatementHandler.class,
				method = "parameterize",
				args = Statement.class
		)
})
@Slf4j
public class HelloMyBatisPlugin implements Interceptor {
	/**
	 * 拦截目标对象的目标方法
	 * @param invocation
	 * @return
	 * @throws Throwable
	 */
	@Override
	public Object intercept(Invocation invocation) throws Throwable {
		log.info("================c.c.j.p.HelloMyBatisPlugin.intercept,{}",invocation);
		// 执行目标方法
		Object proceed = invocation.proceed();
		return proceed;
	}

	/**
	 * 包装目标对象，包装：为目标对象创建代理对象
	 * @param target
	 * @return
	 */
	@Override
	public Object plugin(Object target) {
		// 可以直接使用org.apache.ibatis.plugin.Plugin.wrap方法完成包装操作
		Object wrap = Plugin.wrap(target, this);
		log.info("================c.c.j.p.HelloMyBatisPlugin.plugin,{},{}",target,wrap);
		return wrap;
	}

	/**
	 * 将插件注册时的Properties属性设置进来
	 * @param properties
	 */
	@Override
	public void setProperties(Properties properties) {
		log.info("================c.c.j.p.HelloMyBatisPlugin.intercept,{}",properties);
	}
}
